#include<bits/stdc++.h>
using namespace std;
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
const int N = 2e5 + 10;
#define INF 0x3f3f3f3f;
typedef long long int ll;
#define close(); std::ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
//----------------------------------------------------------------------------//
int e[N], ne[N], h[N], idx, d[N], n, m, top[N], cnt = 1;
// e,ne,h,idx 邻接表模板
// d 代表每个元素的入度
// top是拓扑排序的序列，cnt代表top中有多少个元素
void add(int a, int b)
{
    e[idx] = b;
    ne[idx] = h[a];
    h[a] = idx ++;
}
bool topsort()
{
    queue<int> q;
    int t;
    for(int i = 1; i <= n; ++i) // 将所有入度为0的点加入队列
        if(d[i] == 0) q.push(i);
    while(q.size())
    {
        t = q.front();//每次取出队列的首部
        top[cnt] = t;//加入到 拓扑序列中
        cnt ++; // 序列中的元素 ++
        q.pop();
        for(int i = h[t]; i != -1; i = ne[i])
        {
            // 遍历 t 点的出边
            int j = e[i];
            d[j] --;// j 的入度 --
            if(d[j] == 0) q.push(j); //如果 j 入度为0，加入队列当中
        }
    }
    if(cnt < n) return 0;
    else return 1;

}
int main()
{
    int a, b;
    cin >> n >> m;
    memset(h, -1, sizeof h);
    while(m--)
    {
        cin >> a >> b;
        add(a, b);
        d[b] ++;// a -> b , b的入度++
    }
    if(topsort() == 0) cout << "-1";
    else
    {
        for(int i = 1; i <= n; ++i)
        {
            cout << top[i] << " ";
        }
    }
    return 0;
}
